package com.yan.config;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author ：Yan Guang
 * @date ：Created in 2020/11/18 14:34
 * @description：
 */
@Configuration
public class ShiroConfig {

    //shriofilterfactorybean      3
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        bean.setSecurityManager(defaultWebSecurityManager);//设置安全管理器

        //添加shiro的内置过滤器
        /*
           anon:无需认证就可以访问
           authc:必须认证了才让访问
           user:必须用户记住我功能才能使用
           perms:拥有对某个资源的权限才能查看文档（比如只有管理员才可以访问的）
           role:拥有某个角色权限才能访问
         */

        //设置拦截的路径
        Map<String, String> linkedHashMap = new LinkedHashMap<>();

        //授权，正常情况下会跳转到401
        linkedHashMap.put("/user/add","perms[1]");//必须是user这个用户，并且有跳转到add的权限才可以访问
        linkedHashMap.put("/user/update","perms[2]");//必须是user这个用户，并且有跳转到add的权限才可以访问
        //设置跳转到未授权的请求的界面
        bean.setUnauthorizedUrl("/noauth");

//        linkedHashMap.put("/user/add","authc");
//        linkedHashMap.put("/user/update","authc");
        linkedHashMap.put("/user/*","authc");//通配符也可以使用
        bean.setFilterChainDefinitionMap(linkedHashMap);

        //设置跳转到的未认证的登陆请求路径,需要认证
        bean.setLoginUrl("/toLogin");
        return bean;
    }

    //defaultwebsecuritymanager   2                        //这个注解是合格者的意思，可以通过方法名找到合格的方法
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){//当我们用了bean注解的时候,指定一下方法名即可
        DefaultWebSecurityManager securityManager =new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm);//可以直接通过传参的方式来取得对象，就不用new了，spring会帮我们创建对象
        return securityManager;
    }

    //创建realm对象,自定义 1
    @Bean//加一个bean注解，让spring帮助我们托管我们的类
    public UserRealm userRealm(){
        return new UserRealm();
    }

    //整合shiro和thymeleaf
    @Bean//因为我们没有spring的配置文件了，所以什么东西都只能这样放进ioc容器
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }
}
